'use scrict'
//=======1、普通解构赋值
/*
var [StuName1,StuName2,StuName3]=["黄文聪","江新传","黄叶帅"]
console.log(StuName1);
console.log(StuName2);
console.log(StuName3);

var aaa=[];

aaa=[StuName1,StuName2,StuName3]
console.log(aaa);
aaa[0]='你怎么了呢包被';
console.log(aaa);
StuName1='hhhh'
console.log(StuName1);
console.log(aaa);
*/
//总结：将每个同学的名字都 复制(不是引用) 到数组中





//=======2、解构赋值左右两边解构要一致
/*
var b=[,[,,]];

 b=['我是外层1号',["我是内层1号","我是内层2号","我是内层3号"]];
console.log(b);
*/






//=======3、解构赋值还可以忽略某些元素：
/* 
let [,,x]=[,,'我是第三个，请把我赋给变量x']
console.log(x);
*/




//=======4、如果需要从一个对象中取出若干属性，也可以使用解构赋值，便于快速获取对象的指定属性：
/*
var student1 ={
    name:"黄文聪",
    age:20,
    hobby:'跑步'

}
console.log(student1);

var {name,hobby}=student1
console.log(name);
console.log(hobby);
*/




//=======5、对一个对象进行解构赋值时，同样可以直接对嵌套的对象属性进行赋值，只要保证对应的层次是一致的：
/*
var person = {
    name: '黄文聪',
    age: 20,
    gender: 'male',
    passport: 'G-12345678',
    school: 'No.4 middle school',
    address: {
        city: '广西',
        street: '贵港',
        zipcode: '537100'
    }
};

var {name,address:{city,street,zipcode}}=person;
console.log(name);
console.log(city);
console.log(street);
console.log(zipcode);
*/



//=======6、使用解构赋值对对象属性进行赋值时，如果对应的属性不存在，变量将被赋值为undefined，这和引用一个不存在的属性获得
//undefined是一致的。如果要使用的变量名和属性名不一致，可以用下面的语法获取：
/* 
var stu={
    name:"黄文聪",
    sex:"男",
    hobby:"跑步",
    
};
//这和引用一个不存在的属性获得undefined是一致的。如果要使用的变量名和属性名不一致，可以用下面的语法获取：
var {id,name,sex,hobby:merit,de="我是默认滴"}=stu
console.log(id);
console.log(name);
console.log(sex);
console.log(merit);//merit变量是stu对象中没有的属性，所以需要用hobby：来为merit获取对象的hobby属性
console.log(de);//解构赋值还可以使用默认值，这样就避免了不存在的属性返回undefined的问题：
*/



//=======7、有些时候，如果变量已经被声明了，再次赋值的时候，正确的写法也会报语法错误：
/*
var x=10;
    y=20;


let stu1={
    name:"小明",
    x:100,
    y:59
}
console.log(x);
console.log(y);
 ({x,y}=stu1)//应为声明或语句。此 "=" 遵循语句块，因此如果打算编写重构赋值，则可能需要用括号将整个赋值括起来。
console.log(x);
console.log(y);
([x,y]=["你不能修改我","我就要修改你"]);//此处不加括号也不会报错，因为不是{}。
console.log(x);
console.log(y);
*/




//==========================解构赋值的使用场景========================

//======1、两个变量交换值,不再需要一个临时变量作为中间变量
/*
var x=10;
    y=50;

[x,y]=[y,x];
console.log(x);
console.log(y);
*/



//======2、快速获取当前页面的域名和路径：

var {hostname:domain, pathname:path} = location;//啥意思啊啊啊


//======3、如果一个函数接收一个对象作为参数，那么，可以使用解构直接把对象
//         的属性绑定到变量中。例如，下面的函数可以快速创建一个Date对象：
//new Date()子方法用法参考网站：https://www.cnblogs.com/jzxy/articles/13041814.html
/*
//获取系统的时间并输出
function myfunction (){
var Time=new Date()
let [year,month,day,hour,minute,second]=[Time.getFullYear(),Time.getMonth(),Time.getDay(),Time.getHours(),Time.getMinutes(),Time.getSeconds()].map(n=>n,n=n)

return year+"-"+month+"-"+day+"-"+" "+hour+":"+minute+":"+second
}
console.log(myfunction()); 
*/
//用户自定义年月日
/*
function  custom(year,month,day,hour,minute,second){
//==================用户输出参数
let T=new Date();
[year,month,day,hour,minute,second]=[T.setFullYear(year),T.setMonth(month),T.];

return T
}

console.log(custom(2021,11,03,23,44,45).toLocaleString());//第一种格式：2021/11/3 下午11:44:45
*/
